package com.itbaizhan.controller;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

@Controller
public class UploadController {

    //查看提交的数据，都是字节（乱码）
    /*@RequestMapping("/fileUplload")
    //用HttpServletRequest从前端页面获取数据
    public String upload(HttpServletRequest request) throws Exception {
        // 获取输入流
        ServletInputStream is = request.getInputStream();
        // 从输入流获取请求体数据
        int i = 0;
        while ((i = is.read()) != -1) {
            System.out.println((char) i);
        }
        return "index";
    }*/
    /* 原生方式上传 (了解)*/
    @RequestMapping("/fileUpload")
    public String upload1(HttpServletRequest request) throws Exception {
        //1，创建文件夹，存放上传文件
        //（1）设置上传文件夹的真实路径
        String realPath = request.getSession().getServletContext().getRealPath("/upload");

        //(2)判断该目录是否存在，如果不存在，创建该目录
            File file = new File(realPath);
            if(!file.exists()){
                file.mkdirs();
            }
         //2,分析请求体
            //(1)创建磁盘工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //(2)创建上传数据分析器对象
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
        //(3)利用分析器对象解析请求体，返回所有数据
        List<FileItem> fileItems = servletFileUpload.parseRequest(request);
        //(4)遍历所有数据，找到文件项（非表单项）
            for(FileItem fileItem:fileItems){
                //3，将文件数据写入文件夹
                if(!fileItem.isFormField()) {
                    //(1)获取文件名
                    String name = fileItem.getName();
                    //(2)将文件写入磁盘
                    fileItem.write(new  File(file,name));
                    //(3)删除内存中的临时文件
                    fileItem.delete();
                }
            }
            return "index";
    }
    /*SpringMvc 方式上传 （重点）*/
    //SpringMVC使用框架提供的文件解析器对象，可以直接将请求体中的文
    // 件数据转为MultipartFile对象，从而省略原生上传中分析请求体
    // 的步骤。

        @RequestMapping("fileUpload2")
        /*MultipartFile属性名必须和JSP文件空间的name属性一至*/
    public String upload2(MultipartFile file,HttpServletRequest request) throws IOException {
        //创建文件夹，获取上传文件
            String realPath = request.getSession().getServletContext().getRealPath("upload");
            File dir = new File(realPath);
            if(!dir.exists()){
                dir.mkdirs();
            }

            //将上传的数据写到文件夹中的文件中
            //1.拿到上传的文件名 (必须这样写)  file是传进来的参数的file
            String filename = file.getOriginalFilename();
            //在文件名前加数字，防止重名
            filename = UUID.randomUUID()+"_"+filename;
            //2，创建空文件
            File newFile = new File(dir,filename);
            //3.将数据写入文件中
            file.transferTo(newFile);
            return "index";
        }

        /*同时上传多个文件   注：在spring.xml中配置一次性上传的最大值
        * MultipartFile[] 是数组
        * 参数名和JSP文件控件的name属性一致*/
    @RequestMapping("/fileUpload3")
    public String upload3(String username,MultipartFile[] files,HttpServletRequest request) throws IOException {
       //获取普通的属性
        System.out.println(username);
        //1.设置上传文件保存的文件夹
        String realPath = request.getSession().getServletContext().getRealPath("upload");
        File dir = new File(realPath);
        if(!dir.exists()){
            dir.mkdirs();
        }

        //2.遍历数组，将上传文件保存到文件夹
        for(MultipartFile file:files){
            //获得文件名
            String filename = file.getOriginalFilename();
            filename = UUID.randomUUID()+"_"+filename;
            //新建一个空文件
            File newfile = new File(dir,filename);
            //内容写入文件
            file.transferTo(newfile);
        }
        return "index";
    }


    /*异步上传文件
    * 之前的上传方案，在上传成功后都会跳转页面。而在实际开发中，
    * 很多情况下上传后不进行跳转，而是进行页面的局部刷新，
    * 比如：上传头像成功后将头像显示在网页中。
    * 这时候就需要使用异步文件上传
    *
    * 编写JSP页面，引入jQuery和jQuery表单上传工具jquery.form.js*/
    @RequestMapping("/fileUpload4")
    //不进行页面跳转
    @ResponseBody
    public String upload4(HttpServletRequest request,MultipartFile file) throws IOException {
        String readPath = request.getSession().getServletContext().getRealPath("upload");
        File dir = new File(readPath);
        if(!dir.exists()){
            dir.mkdirs();
        }
        // 拿到上传文件名
        String filename = file.getOriginalFilename();
        filename = UUID.randomUUID()+"_"+filename;
        // 创建空文件
        File newfile = new File(dir,filename);
        // 将上传的文件写到空文件中
        file.transferTo(newfile);
        // 返回文件的路径  注意两条 /
        return "/upload/"+filename;
    }

    /*异步上传文件（敲第二次）*/

    @RequestMapping("/fileUploadFour")
    @ResponseBody     //不进行页面跳转
    public String fileUploadFour(HttpServletRequest request,MultipartFile file) throws IOException {
        String realPath = request.getSession().getServletContext().getRealPath("upload");
        File dir = new File(realPath);
        if(!dir.exists()){
            dir.mkdirs();
        }
        String filename = file.getOriginalFilename();
        filename = UUID.randomUUID()+"_"+filename;
        // 创建空文件
        File newfile = new File(dir,filename);
        // 将上传的文件写到空文件中
        file.transferTo(newfile);
        return "/upload/"+filename;
    }


    /*跨服务器上传
    * 客户端--文件上传-->项目服务器（java工程）--保存文件-->文件服务器
    * 由于文件占据磁盘空间较大，在实际开发中往往会将文件上传到其他服务器中，此时需要使用跨服务器上传文件。

解压tomcat作为图片服务器，在tomcat的webapps下创建upload目录作为
 文件上传目录。

修改tomcat的conf/web.xml文件，支持跨服上传。
<servlet>
  <init-param>
    <param-name>readonly</param-name>
    <param-value>false</param-value>
  </init-param>
</servlet>
修改tomcat的conf/server.xml文件，修改tomcat端口，修改完开启tomcat服务器

<Connector port="8081" protocol="HTTP/1.1"        connectionTimeout="20000" redirectPort="8443" />
*
* 添加跨服上传依赖

<!-- 跨服上传 -->
<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-core</artifactId>
  <version>1.18.1</version>
</dependency>
<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>1.18.1</version>
</dependency>
*
* client：n.委托人；当事人;顾客；主顾；客户;接受社会救济者；救济对象;客户程序；客户机;受保护者；救济对象;*/

    /*tomcat也要启动点击bin/startup.bat,再启动mvc工程*/
    @RequestMapping("/fileUpload5")
    @ResponseBody
    public String upload5(HttpServletRequest request,MultipartFile file) throws IOException {
        //设置跨服上传的服务器路径
           String path = "http://localhost:8081/upload/";
        //获取上传的文件名
            String filename = file.getOriginalFilename();
            filename = UUID.randomUUID()+"_"+filename;
        //跨服上传
        //1,创建客户端对象
        Client client = Client.create();
        //2，使用客户端对象连接图片服务器
        WebResource resource = client.resource(path + filename);
        //3，数据传输  使用字节形式上传
        resource.put(file.getBytes());
        //4,返回路径
        return path+filename;
    }


    /*（敲第二次）*/
    @RequestMapping("/uploadFive")
    @ResponseBody
    public String uploadFive(HttpServletRequest request,MultipartFile file) throws IOException {
        //设置跨服上传的服务器路径
        String path = "http://localhost:8081/upload/";
        //获取上传的文件名
        String filename = file.getOriginalFilename();
        filename = UUID.randomUUID()+"_"+filename;
        //跨服上传
        //1,创建客户端对象
        Client client = new Client();
       //2，使用客户端对象连接图片服务器
        WebResource resource = client.resource(path + filename);
        //3，数据传输  使用字节形式上传
        resource.put(file.getBytes());
        //4,返回路径
        return path+filename;
    }


}
/*SpringMvc 方式上传
在SpringMVC核心配置文件配置文件解析器

<!-- 文件解析器对象，id名称必须是multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <!-- 支持一次上传文件的总容量。单位：字节 100M = 100*1024*1024-->
  <property name="maxUploadSize" value="104857600"/>
  <!-- 文件名的编码方式-->
  <property name="defaultEncoding" value="utf-8"/>
</bean>*/

/*
<!--2，开启springmvc注解支持与开启转换器-->
<mvc:annotation-driven >

<!--解决乱码问题
        上传文件时，文件名有中文，要设置这，否则上传后图片不可以显示-->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="defaultCharset">
<value>UTF-8</value>
</property>
</bean>
</mvc:message-converters>

 */